package br.com.fogas.database.dao.impl;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.fogas.database.FogasDatabase;
import br.com.fogas.database.IMetadata.ICliente;
import br.com.fogas.database.IMetadata.IMedidor;
import br.com.fogas.database.dao.IClienteDao;
import br.com.fogas.database.entidade.Canal;
import br.com.fogas.database.entidade.Cliente;
import br.com.fogas.database.entidade.CondicaoPagto;
import br.com.fogas.database.entidade.Medidor;
import br.com.fogas.utils.StringUtility;
import br.com.fogas.webservice.parser.cliente.T_Cliente_Item;

import com.j256.ormlite.dao.BaseDaoImpl;
import com.j256.ormlite.stmt.QueryBuilder;

public class ClienteDao extends BaseDaoImpl<Cliente, Integer> implements IClienteDao {
	
	private FogasDatabase database;
	
	public ClienteDao(FogasDatabase database) throws SQLException {
		super(database.getConnectionSource(), Cliente.class);
		this.database = database;
	}

	@Override
	public void sincronizar(List<T_Cliente_Item> clientes) throws SQLException {
		for (T_Cliente_Item item : clientes) {
			Canal canal = null;
			if(StringUtility.isNotEmpty(item.getTx_cod_cliente()))
				canal = database.getCanal().listarCanalPorCodCliente(item.getTx_cod_cliente());
			
			CondicaoPagto condicao = null;
			if(StringUtility.isNotEmpty(item.getTx_cod_cond_pagto()))
				condicao = database.getCondicaoPagamento().listarCondicaoPorCodigo(item.getTx_cod_cond_pagto());
				
			Cliente cliente = new Cliente(item, canal, condicao);
			create(cliente);
		}
	}

	@Override
	public Cliente listarClientePorCodigo(String codCliente)
			throws SQLException {
		List<Cliente> clientes = queryBuilder()
		.where().eq(ICliente.tx_cod_cliente, codCliente)
		.query();
		
		if(clientes.size() == 1) {
			return clientes.get(0);
		} else {
			return null;
		}
	}

	@Override
	public List<Cliente> listarLocais() throws SQLException {
		QueryBuilder<Medidor, Integer> qb = database.getMedidor().queryBuilder();
		qb.groupBy(IMedidor.tx_cod_local);
		List<Medidor> query = qb.query();
		
		List<Cliente> locais = new ArrayList<Cliente>();
		for (Medidor medidor : query) {
			locais.add(medidor.getTx_cod_local());
		}
		
		return locais;
	}

	@Override
	public List<Cliente> listarClientesPorLocal(Cliente local)
			throws SQLException {
		QueryBuilder<Medidor, Integer> qb = database.getMedidor().queryBuilder();
		qb.where().eq(IMedidor.tx_cod_local, local);
		qb.groupBy(IMedidor.tx_cod_cliente);
		List<Medidor> medidores = qb.query();

		List<Cliente> clientes = new ArrayList<Cliente>();
		for (Medidor medidor : medidores) {
			clientes.add(medidor.getTx_cod_cliente());
		}
		
		return clientes;
	}
}
